/**
 * @file sys_wdt.h
 * @brief 系统软件看门狗（基于硬件看门狗实现）
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2021-04-08
 * @copyright Copyright (c) 2021  烽火通信
 */
#ifndef __SYS_WDT_H
#define __SYS_WDT_H 
#include <stdint.h>

#ifndef THREADWDT_MAXNUM
#define THREADWDT_MAXNUM    100
#endif

/*  */
typedef enum TASK_WDT_E
{
	ENUM_TASK_LCD = 0,
    ENUM_TASK_TILT,
    ENUM_TASK_ALARM_SEND,
    ENUM_TASK_ALARM_LED,
    ENUM_TASK_UART1,
    ENUM_TASK_UART5,
    ENUM_TASK_BLUETOOTH,
    ENUM_TASK_UP1,
    ENUM_TASK_STRONG_CURRENT,
    ENUM_TASK_WEAK_CURRENT,
    ENUM_TASK_LEAKAGE,
    ENUM_TASK_TEMPERATURE,
    ENUM_TASK_PLAN,
    ENUM_TASK_HEART,
    ENUM_TASK_DI,
    ENUM_TASK_TCP,
    ENUM_TASK_TCP_RECON,
    ENUM_TASK_UP2
}TASK_WDT_MOD;

#define LONG_ENUM_TASK_LCD          20
#define LONG_TASK_TILT              20
#define LONG_TASK_ALARM_SEND        20
#define LONG_TASK_ALARM_LED         20
#define LONG_TASK_UART1             20
#define LONG_TASK_UART5             20
#define LONG_TASK_BLUETOOTH         20    
#define LONG_TASK_UP1               20
#define LONG_TASK_STRONG_CURRENT    20
#define LONG_TASK_WEAK_CURRENT      20
#define LONG_TASK_LEAKAGE           20
#define LONG_TASK_TEMPERATURE       20
#define LONG_TASK_PLAN              20
#define LONG_TASK_HEART             20
#define LONG_TASK_DI                20
#define LONG_TASK_TCP               20
#define LONG_TASK_TCP_RECON         20
#define LONG_TASK_UP2               20

/** @brief  */
typedef struct threadWdt_s
{
    uint8_t Enable;         ///< 使能监测（0：使能，非0：使能）
    uint32_t Counter;       ///< 运行计数
    uint32_t MaxValue;      ///< 最大计数（触发异常回调）

    void (*err_cb)(void);   ///< 异常回调处理函数（为空则调用默认看门狗处理函数）

    struct threadWdt_s *next;
	TASK_WDT_MOD task_wdt;
} threadWdt_t;


/**
 * @brief 任务监测看门狗创建
 * @param[in]  p_wdt    软狗句柄
 * @param[in]  mvalue   异常最大计数
 * @param[in]  cb       异常回调
 * @return int8_t 0：成功，-1：失败
 */
int8_t threadWdt_Create(threadWdt_t **pp_wdt, uint32_t mvalue, void(*cb)(void),TASK_WDT_MOD wdt);

/**
 * @brief 任务监测看门狗删除
 */
void threadWdt_Delete(threadWdt_t **pp_wdt);

/**
 * @brief 任务监测看门狗喂狗
 */
void threadWdt_Feed(TASK_WDT_MOD task_num);

/**
 * @brief 软狗初始化
 */
void threadWdt_init( void );


#endif	 // __SYS_WDT_H 

/*********** (C) COPYRIGHT 2021 FiberHome *****END OF FILE****/
